package com.sanyou.service;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Author xhy
 * @Description 本类封装了对Redis缓存数据库的操作
 * @Date: 2022/11/1
 */
@Deprecated
public interface CacheService {
    /**
     * 数据缓存至redis(使用默认前缀)
     * @param key 键名
     * @param value 存入的对象实例
     * @param <V> 存入对象的类型
     */
    public <V> void set(String key, V value);

    /**
     * 数据缓存至redis并设置过期时间
     * @param key
     * @param value
     * @param timeout 时长
     * @param unit 时间单位
     * @param <V>
     */
    public <V> void set(String key, V value, long timeout, TimeUnit unit);

    /**
     * 根据key从缓存数据库中获取对应值并转化为相应对象
     * @param key
     * @param clazz
     * @param <V>
     */
    public <V> V get(String key, Class<V> clazz);

    /**
     * 根据key从缓存数据库中获取对应值
     * @param key
     * @return
     */
    public String get(String key);

    /**
     * 数据右插到缓存数据库key对应的列表中
     * @param key
     * @param value
     * @param <V>
     */
    public <V> void rightPush(String key, V value);

    /**
     * 数据左插到缓存数据库key对应的列表中
     * @param key
     * @param value
     * @param <V>
     */
    public <V> void leftPush(String key, V value);

    /**
     * 根据key从对应列表左边弹出一条记录，并转为相应类型的对象
     * @param key
     * @param clazz
     * @param <V>
     * @return
     */
    public <V> V leftPop(String key, Class<V> clazz);

    /**
     * 根据key从对应列表右边弹出一条记录，并转为相应类型的对象
     * @param key
     * @param clazz
     * @param <V>
     * @return
     */
    public <V> V rightPop(String key, Class<V> clazz);

    /**
     * 根据key从对应列表左边弹出一条记录
     * @param key
     * @return
     */
    public String leftPop(String key);

    /**
     * 根据key从对应列表右边弹出一条记录
     * @param key
     * @return
     */
    public String rightPop(String key);

    /**
     * 数据缓存至redis的列表中(右插)
     * @param key
     * @param value
     * @return
     */
    public <V> void addToList(String key, V value);

    /**
     * 从key对应的列表中弹出一条记录,并转化为对应类型的对象(左出)
     * @param key
     * @param clazz
     * @return
     */
    public <V> V popValueFromList(String key,Class<V> clazz);

    /**
     * 根据key查询列表中start~end区间内的记录
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<String> lRange(String key,long start,long end);

    /**
     * 根据key查询所有列表中的所有记录，并转化为对应类型
     * @param key
     * @param clazz 要转化成的类型
     * @param <V>
     * @return
     */
    public  <V> List<V> lRange(String key, Class<V> clazz,long start,long end);

    /**
     * 根据key查询所有列表中的所有记录，并转化为对应类型
     * @param key
     * @param clazz 要转化成的类型
     * @param <V>
     * @return
     */
    public <V> List<V> getValuesFromList(String key, Class<V> clazz);

    /**
     * 根据key查询列表中start~end区间内的记录，并转化为对应类型
     * @param key
     * @param clazz 要转化成的类型
     * @param start 起始点
     * @param end 结束点
     * @param <V>
     * @return
     */
    public <V> List<V> getValuesFromList(String key,Class<V> clazz,long start,long end);

    /**
     * 根据key查询列表中start~end区间内的记录
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<String> getValuesFromList(String key,long start,long end);

    /**
     * 根据key获取对应列表的长度
     * @param key
     * @return
     */
    public Long lLen(String key);

    /**
     * 根据key获取对应列表的长度
     * @param key
     * @return
     */
    public Long getSizeOfList(String key);

    /**
     * 删除key
     * @param key
     */
    public void delete(String key);

    /**
     * 设置过期时间
     * @param key
     * @param timeout 时长
     * @param unit 时间单位
     * @return
     */
    public Boolean expire(String key, long timeout, TimeUnit unit);

    /**
     * 返回 key 的剩余的过期时间
     * @param key
     * @return
     */
    public Long getExpire(String key);

    /**
     * 返回 key 的剩余的过期时间,并转化为对应时间单位
     * @param key
     * @param unit 时间单位
     * @return
     */
    public Long getExpire(String key, TimeUnit unit);

    /**
     * 移除 key 的过期时间，key 将持久保持
     * @param key
     * @return
     */
    public Boolean persist(String key);

    /**
     * 获取所有键值
     * @return
     */
    public Set<String> keys();

    /**
     * 通过自定义匹配模式匹配键值
     * @param pattern
     * @return
     */
    public Set<String> keys(String pattern);

    /**
     * sorted Set添加元素
     * @param key
     * @param value
     * @param score 排序优先级
     * @param <V>
     */
    public <V> void zAdd(String key, V value,double score);

    /**
     * sorted Set
     * @param key
     * @param value
     * @param <V>
     */
    public <V> void zAdd(String key, V value);

    /**
     * 获取start-end区间内的元素，并转化为对应类型
     * @param key
     * @param clazz
     * @param start
     * @param end
     * @param <V>
     * @return
     */
    public <V> Set<V> zRange(String key, Class<V> clazz,long start,long end);

    /**
     * 获取start-end区间内的元素
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> zRange(String key,long start,long end);

    /**
     * 逆序获取start-end区间内的元素
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> zRevrange(String key,long start,long end);

    /**
     * 逆序获取start-end区间内的元素，并转化为对应类型
     * @param key
     * @param clazz
     * @param start
     * @param end
     * @param <V>
     * @return
     */
    public <V> Set<V> zRevrange(String key, Class<V> clazz,long start,long end);

    /**
     * 获取zset内的所有元素
     * @param key
     * @param clazz
     * @param <V>
     * @return
     */
    public <V> Set<V> zRangeAll(String key, Class<V> clazz);

    /**
     * 返回score介于min-max之间的有序集，并转化为对应类型
     * @param key
     * @param clazz
     * @param min
     * @param max
     * @param <V>
     * @return
     */
    public <V> Set<V> zRangeByScore(String key, Class<V> clazz,double min,double max);

    /**
     * 返回score介于min-max之间的有序集
     * @param key
     * @param min
     * @param max
     * @return
     */
    public Set<String> zRangeByScore(String key, double min,double max);


    /**
     * 返回key对应的zset中的记录数
     * @param key
     * @return
     */
    public long getSizeOfZSet(String key);
}
